package main

import (
	"database/sql"
	"fmt"
	_ "github.com/go-sql-driver/mysql"
	"log"
	"net"
	"sync"
)
var mu sync.RWMutex

func help() string {
	return (`
    当前菜单:
        - register : 注册。            格式:"register"
        - login    : 登录。            格式:"login"
        - logoff   : 注销登录。         格式:"logoff"
        - exit     : 退出系统。         格式:"exit"
        - add      : 添加好友。         格式:"add"
        - delete   : 删除好友。         格式:"delete"
        - list     : 查看好友列表。      格式:"list"
        - sendTo   : 给某位好友发送消息。 格式:"sendTo"
        - sendAll  : 给全部好友发送消息。 格式:"sendAll"
        `)
}

//客户端的结构体？
type Clinet struct {
	userName string
}

//建立一个名字是userCH的只写channel 类型为字符串
type userCH chan <- string

var(
	messages = make(chan string)//未知用法
	entering = make(chan userCH)
	leaving = make(chan userCH)
	clients = make(map[string] userCH)//所有客户端的map？
	db*sql.DB//database
)
func main()  {
	var err error//定义一个变量用来接收抛出的错误

	//打开一个数据库链接，这里好像不是直接去创建一个链接
	//因为将用户名等连接信息故意填错并不会抛出err
	//所以猜测不是马上建立连接的，什么时候建立暂时未知
	db,err = sql.Open("mysql","hasee:19751220@tcp(www.7so.xyz:3306)/chat?charset=utf8mb4")

	defer db.Close()//main函数返回之前调用db.close关闭数据库连接

	if err != nil {
		log.Fatalln(err)//输出日志到控制台，并且退出进程
	}

	//执行建表语句
	db.Query("create table if not exists user(id int auto_increment primary key, userName varchar(20) unique, password varchar(20) not null, tel varchar(20) unique);")

	listen, err := net.Listen("tcp","0.0.0.0:9003")
	if err != nil {
		log.Fatal(err)
	}
	//while 开始从监听端口中取连接
	for{
		conn, err :=listen.Accept()//这里是阻塞的，不会一直循环，类似channel中取数据？
		if err != nil {
			log.Print(err)
			continue
		}
		go handle(conn)//起一个go程去处理
	}
}

func handle(conn net.Conn)  {
	fmt.Println("有连接了1")
	//这里开始处理具体业务
	//一般先定义协议
	//todo有空再写
}